import django_filters
from django.db.models import Q

from app.goods.models import Goods


class GoodsFilter(django_filters.rest_framework.FilterSet):
    """
    商品过滤的类
    """
    # 两个参数，name是要过滤的字段，lookup是执行的行为，‘小与等于本店价格’
    price_min = django_filters.NumberFilter(field_name="shop_price", lookup_expr='gte')
    price_max = django_filters.NumberFilter(field_name="shop_price", lookup_expr='lte')
    top_category = django_filters.NumberFilter(field_name='category', method='top_category_filter')

    def top_category_filter(self, query_set, name, value):
        """
        :param query_set: Good.objects.all()
        :param name: category
        :param value: 1
        :return:
        需求: 找出分类id=1的所有商品列表.
        分类: 电子产品(1) --> 电脑(5)  --> 平板电脑(12)
                                     --> 笔记本电脑(13)
                         --> 手机(4)


        商品: 华为xxxx笔记本电脑， 商品分类笔记本电脑
        """
        # Q:数据库模型中用于筛选的命令
        return Goods.objects.filter(Q(category_id=value) |
                                    Q(category__parent_category_id=value) |
                                    Q(category__parent_category__parent_category_id=value)
                                    )

    class Meta:
        model = Goods
        # fields = ['price_min', 'price_max']
        # 只需要在过滤器中增加“is_hot”, 在后台设置商品的“is_hot”为True,然后前端就可以显示出来了。
        # fields = ['price_min', 'price_max', 'is_hot']
        fields = ['price_min', 'price_max', 'is_hot', 'is_new']
